<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Carbon\Carbon;

abstract class BaseResource extends JsonResource
{
    /**
     * 格式化日期时间
     *
     * @param mixed $date
     * @param string $format
     * @return string|null
     */
    protected function formatDateTime($date, string $format = 'Y-m-d H:i:s'): ?string
    {
        if (!$date) {
            return null;
        }

        try {
            // 如果已经是格式化好的字符串（格式：Y-m-d H:i:s），直接返回
            if (is_string($date) && preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $date)) {
                return $date;
            }

            // 获取应用时区
            $timezone = config('app.timezone', 'Asia/Shanghai');
            
            // 如果是字符串，解析为Carbon实例
            if (is_string($date)) {
                // 如果是ISO格式（包含T或Z），需要解析
                if (strpos($date, 'T') !== false || strpos($date, 'Z') !== false) {
                    $date = Carbon::parse($date);
                } else {
                    // 尝试解析其他格式
                    $date = Carbon::parse($date);
                }
            }

            // 如果是Carbon实例
            if ($date instanceof Carbon) {
                // Laravel从数据库读取的时间默认是UTC，需要转换为应用时区
                // 使用copy()避免修改原实例
                $carbon = $date->copy();
                // 设置时区（如果原时间是UTC，转换为应用时区）
                if ($carbon->timezone->getName() !== $timezone) {
                    $carbon->setTimezone($timezone);
                }
                return $carbon->format($format);
            }
            
            // 如果是DateTime实例，转换为Carbon后处理
            if ($date instanceof \DateTime || $date instanceof \DateTimeInterface) {
                $carbon = Carbon::instance($date);
                if ($carbon->timezone->getName() !== $timezone) {
                    $carbon->setTimezone($timezone);
                }
                return $carbon->format($format);
            }
        } catch (\Exception $e) {
            // 如果解析失败，记录日志并尝试返回原值
            \Log::warning('时间格式化失败: ' . $e->getMessage(), [
                'date' => $date,
                'date_type' => gettype($date),
            ]);
            // 如果是字符串，返回原字符串
            return is_string($date) ? $date : null;
        }

        return null;
    }

    /**
     * 格式化日期
     *
     * @param mixed $date
     * @param string $format
     * @return string|null
     */
    protected function formatDate($date, string $format = 'Y-m-d'): ?string
    {
        return $this->formatDateTime($date, $format);
    }

    /**
     * 格式化时间
     *
     * @param mixed $time
     * @param string $format
     * @return string|null
     */
    protected function formatTime($time, string $format = 'H:i:s'): ?string
    {
        return $this->formatDateTime($time, $format);
    }
}

